#include <iostream>
#include <stdlib.h>

int uninit_gval; // 未初始化全局变量
int init_gval = 100; // 初始化全局变量

int main(int argc, char *argv[], char *env[])
{
    printf("main函数 地址: %p\n", main); 

    const char* str = "test message";
    printf("只读字符串常量 地址: %p\n", str);
    printf("已初始化全局变量 地址: %p\n", &init_gval);
    printf("未初始化全局变量 地址: %p\n", &uninit_gval);

    static int num = 0;
    printf("静态局部变量 地址: %p\n", &num);

    char* heap1 = (char*)malloc(100); // 在堆上申请空间
    char* heap2 = (char*)malloc(100);
    char* heap3 = (char*)malloc(100);
    char* heap4 = (char*)malloc(100);
    printf("heap1 地址: %p\n", heap1);
    printf("heap2 地址: %p\n", heap2);
    printf("heap3 地址: %p\n", heap3);
    printf("heap4 地址: %p\n", heap4);

    printf("stack1(&heap1) 地址: %p\n", &heap1);
    printf("stack2(&heap2) 地址: %p\n", &heap2);
    printf("stack3(&heap3) 地址: %p\n", &heap3);
    printf("stack4(&heap4) 地址: %p\n", &heap4);

    for(int i = 0; argv[i]; ++i)
    {
        std::cout << "命令行参数地址:" << std::endl;
        printf("argv[%d]: %p\n", i, argv[i]);
    }

    for(int i = 0; env[i]; ++i)
    {
        std::cout << "环境变量地址:" << std::endl;
        printf("env[%d]: %p\n", i, env[i]);
    }
    
    return 0;
}